home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 8: LINUX Games / Linux Cubed Series 8 - LINUX Games.iso / games / muds / lpmud312.tar / lpmud312 / wiz_list.c < prev    next >
C/C++ Source or Header  |  1991-12-09  |  6KB  |  314 lines

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include "lint.h"
  4. #include "wiz_list.h"
  5. #include "interpret.h"
  6. #include "config.h"
  7.  
  8. #define DOMAINS
  9. /*
  10.  * Maintain the wizards high score list about most popular castle.
  11.  */
  12.  
  13. extern char *string_copy PROT((char *)), *xalloc PROT((int));
  14.  
  15. struct wiz_list *all_wiz;
  16.  
  17. /*
  18.  * Sort the wiz list in ascending order.
  19.  */
  20.  
  21. static struct wiz_list *insert(w, wl)
  22.     struct wiz_list *w, *wl;
  23. {
  24.     if (wl == 0) {
  25.     w->next = 0;
  26.     return w;
  27.     }
  28.     if (w->score > wl->score) {
  29.     wl->next = insert(w, wl->next);
  30.     return wl;
  31.     }
  32.     w->next = wl;
  33.     return w;
  34. }
  35.  
  36. static void rebuild_list() {
  37.     struct wiz_list *wl, *w, *new_list = 0;
  38.  
  39.     for (w = all_wiz; w; w = wl) {
  40.     wl = w->next;
  41.     new_list = insert(w, new_list);
  42.     }
  43.     all_wiz = new_list;
  44. }
  45.  
  46. /*
  47.  * Find the data, if it exists.
  48.  */
  49. static struct wiz_list *find_wiz(name)
  50.     char *name;
  51. {
  52.     int length;
  53.     struct wiz_list *wl;
  54.  
  55.     length = strlen(name);
  56.     for (wl = all_wiz; wl; wl = wl->next)
  57.         if (wl->length == length && strcmp(wl->name, name) == 0)
  58.         return wl;
  59.     return 0;
  60. }
  61.  
  62. /*
  63.  * Check that a name exists. Add it, if it doesn't.
  64.  */
  65. struct wiz_list *add_name(str)
  66.     char *str;
  67. {
  68.     struct wiz_list *wl;
  69.  
  70.     wl = find_wiz(str);
  71.     if (wl)
  72.         return wl;
  73.     wl = (struct wiz_list *)xalloc(sizeof (struct wiz_list));
  74.     str = string_copy(str);
  75.     wl->name = str;
  76.     wl->length = strlen(str);
  77.     wl->score = 0;
  78.     wl->cost = 0;
  79.     wl->heart_beats = 0;
  80.     wl->total_worth = 0;
  81.     wl->next = all_wiz;
  82.     wl->size_array = 0;
  83.     wl->file_name = 0;
  84.     wl->error_message = 0;
  85.     all_wiz = wl;
  86.     return wl;
  87. }
  88.  
  89. /*
  90.  * Add score to an existing name.
  91.  */
  92. void add_score(name, score)
  93.     char *name;
  94.     int score;
  95. {
  96.     struct wiz_list *wl;
  97.  
  98.     wl = find_wiz(name);
  99.     if (!wl)
  100.         fatal("Add_score: could not find wizard %s\n", name);
  101.     wl->score += score;
  102. }
  103.  
  104. /*
  105.  * This one is called at every complete walkaround of reset.
  106.  */
  107. void wiz_decay() {
  108.     struct wiz_list *wl;
  109.     static int next_time;
  110.     extern int current_time;
  111.  
  112.     /* Perform this once every hour. */
  113.     if (next_time > current_time)
  114.     return;
  115.     next_time = current_time + 60 * 60;
  116.     for (wl = all_wiz; wl; wl = wl->next) {
  117.         wl->score = wl->score * 99 / 100;
  118.     wl->total_worth = wl->total_worth * 99 / 100;
  119.     wl->cost = wl->cost * 9 / 10;
  120.     wl->heart_beats = wl->heart_beats * 9 / 10;
  121.     }
  122. }
  123.  
  124. /*
  125.  * Load the wizlist file.
  126.  */
  127. void load_wiz_file()
  128. {
  129.     char buff[1000];        /* I hate not knowing how much I need. */
  130.     FILE *f;
  131.  
  132.     f = fopen("WIZLIST", "r");
  133.     if (f == NULL)
  134.         return;
  135.     while(fgets(buff, sizeof buff, f) != NULL) {
  136.         char *p;
  137.     int score;
  138.  
  139.     p = strchr(buff, ' ');
  140.     if (p == 0) {
  141.         fprintf(stderr, "Bad WIZLIST file.\n");
  142.         break;
  143.     }
  144.     *p = '\0';
  145.     p++;
  146.     if (*p == '\0') {
  147.         fprintf(stderr, "Bad WIZLIST file.\n");
  148.         break;
  149.     }
  150.     score = atoi(p);
  151.     if (score > 0) {
  152.         (void)add_name(buff);
  153.         add_score(buff, atoi(p));
  154.     }
  155.     }
  156.     fclose(f);
  157. }
  158.  
  159. /*
  160.  * Save the wizlist file.
  161.  */
  162. void save_wiz_file()
  163. {
  164.     struct wiz_list *wl;
  165.     FILE *f;
  166.  
  167.     f = fopen("WIZLIST", "w");
  168.     if (f == NULL) {
  169.         fprintf(stderr, "Could not open WIZLIST for write\n");
  170.         return;
  171.     }
  172.     for (wl = all_wiz; wl; wl = wl->next)
  173.         fprintf(f, "%s %d %d\n", wl->name, wl->score, wl->total_worth);
  174.     fclose(f);
  175. }
  176.  
  177. void wizlist(v)
  178.     char *v;
  179. {
  180.     struct wiz_list *wl, *this_wiz;
  181.     int total = 0, num = 0, this_pos, total_wizards;
  182.     extern struct object *command_giver;
  183.     int all = 0;
  184.     struct svalue *name;
  185.  
  186.     if (!command_giver)
  187.     return;
  188.     if (v == 0) {
  189.     name = apply("query_real_name", command_giver, 0);
  190.     if (!name || name->type != T_STRING)
  191.         return;
  192.     v = name->u.string;
  193.     }
  194.     if (strcmp(v, "ALL") == 0)
  195.     all = 1;
  196.     this_wiz = find_wiz(v);
  197.     rebuild_list();
  198.     for (num = 0, wl = all_wiz; wl; wl = wl->next) {
  199.         total += wl->score;
  200.     num++;
  201.     if (wl == this_wiz)
  202.         this_pos = num;
  203.     }
  204.     total_wizards = num;
  205.     add_message("\nWizard top score list\n\n");
  206.     this_pos = num - this_pos + 1;
  207.     if (total == 0)
  208.     total = 1;
  209.     for (wl = all_wiz; wl; wl = wl->next) {
  210.     if (!all && num > 15 && (num < this_pos - 2 || num > this_pos + 2))
  211.         ;
  212.     else
  213.         add_message("%-15s %5d %2d%% (%d)\t[%4dk,%5d] %6d %d\n", wl->name,
  214.             wl->score, wl->score * 100 / total, num,
  215.             wl->cost / 1000,
  216.             wl->heart_beats, wl->total_worth, wl->size_array);
  217.     num--;
  218.     }
  219.     add_message("\nTotal         %7d     (%d)\n\n", total, total_wizards);
  220. }
  221.  
  222. void remove_wiz_list() {
  223.     struct wiz_list *wl, *w;
  224.  
  225.     for (w = all_wiz; w; w = wl) {
  226.     free(w->name);
  227.     wl = w->next;
  228.     free((char *)w);
  229.     }
  230. }
  231.  
  232. void save_error(msg, file, line)
  233.     char *msg;
  234.     char *file;
  235.     int line;
  236. {
  237.     struct wiz_list *wl;
  238.     char name[100];
  239.     char *p;
  240.     int len;
  241.  
  242.     p = get_wiz_name(file);
  243.     if(!p)
  244.     return;
  245.     strcpy(name, p);
  246.     wl = add_name(name);
  247.     if (wl->file_name)
  248.     free(wl->file_name);
  249.     len = strlen(file);
  250.     wl->file_name = xalloc(len + 4); /* May add .c plus the null byte, and / */
  251. #ifdef COMPAT_MODE
  252.     strcpy(wl->file_name, file);
  253. #else
  254.     strcpy(wl->file_name, "/");
  255.     strcat(wl->file_name, file);
  256.     len++;
  257. #endif
  258.     /*
  259.      * If it is a cloned object, we have to find out what the file
  260.      * name is, and add '.c'.
  261.      */
  262.     p = strrchr(wl->file_name, '#');
  263.     if (p) {
  264.     p[0] = '.';
  265.     p[1] = 'c';
  266.     p[2] = '\0';
  267.     len = p - wl->file_name + 2;
  268.     }
  269.     if (wl->file_name[len-1] != 'c' || wl->file_name[len-2] != '.')
  270.     strcat(wl->file_name, ".c");
  271.     if (wl->error_message)
  272.     free(wl->error_message);
  273.     wl->error_message = string_copy(msg);
  274.     wl->line_number = line;
  275. }
  276.  
  277. char *get_error_file(name)
  278.     char *name;
  279. {
  280.     struct wiz_list *wl;
  281.  
  282.     wl = add_name(name);
  283.     /*
  284.      * The error_message is used as a flag if there has been any error.
  285.      */
  286.     if (wl->error_message == 0) {
  287.     add_message("No error.\n");
  288.     return 0;
  289.     }
  290.     add_message("%s line %d: %s\n", wl->file_name, wl->line_number,
  291.         wl->error_message);
  292.     free(wl->error_message);
  293.     wl->error_message = 0;
  294.     return wl->file_name;
  295. }
  296.  
  297. /*
  298.  * Argument is a file name, which we want to get the owner of.
  299.  * Ask the master.c object !
  300.  */
  301. char *get_wiz_name(file)
  302.     char *file;
  303. {
  304.     struct svalue *ret;
  305.     static char buff[50];
  306.  
  307.     push_string(file, STRING_CONSTANT);
  308.     ret = apply_master_ob("get_wiz_name", 1);
  309.     if (ret == 0 || ret->type != T_STRING)
  310.     return 0;
  311.     strcpy(buff, ret->u.string);
  312.     return buff;
  313. }
  314.